https://www.ibm.com/developerworks/cn/java/j-lo-jparelated/ 很重要的
在JPA规范中,一对多的双向关系由多端(Employee)来维护。就是说多端(Employee)为关系维护端,负责关系的增删改查。一端(Company)则为关系被维护端,不能维护关系。
一端(Company)使用@OneToMany注释的mappedBy=”company”属性表明Company是关系被维护端。
多端(Employee)使用@ManyToOne和@JoinColumn来注释属性company,@ManyToOne表明Employee是多端,@JoinColumn设置在employee表中的关联字段(外键)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 20 @Entity 21 @Table(name="company") 22 public class Company { 23 24 @Id 25 @GeneratedValue 26 private Long id; 27 28 29 @Column(name="name",length=32) 30 private String name; 31 32 33 @OneToMany(mappedBy="company",cascade=CascadeType.ALL,fetch=FetchType.LAZY) 34 35 36 private Set<Employee> employees = new HashSet<Employee>();
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 17 @Entity 18 @Table(name="employee") 19 public class Employee { 20 21 @Id 22 @GeneratedValue 23 private Long id; 24 25 26 @Column(name="name") 27 private String name; 28 29 30 @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false) 31 @JoinColumn(name="company_id") 32 private Company company; 33 }
|
FetchType.EAGER = 取出这条数据时,它关联的数据也同时取出放入内存中 (维护的一端用eager)
如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)。